import { login, getUserInfo, getUserPhoto, login2 } from '@/api/index'
import { getToken, setToken, removeToken } from "@/utils/auth"
import { asyncRoutes, resetRouter } from "../../router/index"
import router from "@/router"
import roles from '@/router/modules/roles'

const getDefaultState = () => {
    return {
        token: getToken(), // 用户 Token，默认为 ''
        userInfo: {}, // 用户数据
        menus: [],   // 路由权限
    }
}
// 存放数据位置
const state = getDefaultState()

// 直接对于数据的操作
const mutations = {
    RESET_STATE: (state) => {
        // 重置state数据
        // Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
        Object.assign(state, getDefaultState())
    },
    // 设置token
    SET_TOKEN(state, newToken) {
        state.token = newToken
        // 存储一份给 cookie
        setToken(newToken)
    },
    // 删除token
    REMOVE_TOKEN(state) {
        state.token = ''
        removeToken()
    },
    SET_USER(state, value) {
        state.userInfo = value
        // value.roles.menus 初始
        // console.log(asyncRoutes);
        // 过滤出 相对应的路由
        const ruleMenus = asyncRoutes.filter(item =>
            value.roles.menus.indexOf(item.children[0].name) > -1
        )
        console.log(ruleMenus);
        ruleMenus.push(roles)
        // 重新排序
        ruleMenus.sort()
        state.menus = ruleMenus
    },
    // 删除用户信息
    REMOVE_USER(state) {
        state.userInfo = {},
            state.menus = []
    }
}
// 发送网络请求动作
const actions = {
    // 登录逻辑-封装
    async loginActions({ commit }, value) {
        try {
            const res = await login(value)
            const res2 = await login2()
            sessionStorage.setItem('token', res2.data.data.token)
            // 我们只需要token, 保存到上面的vuex中
            commit('SET_TOKEN', res.data)
            // 逻辑页面还在接收数组, 外面写成功/失败的逻辑, 所以这里要把数组返回出去
            // return到actions调用的地方(login/index.vue)
            // 被async修饰的函数 都会返回Promise的success 除非Promise.reject()
            return res
        } catch (err) {
            return Promise.reject(err)
        }
    },
    // 获取用户-信息
    async getUserInfoActions({ commit }) {
        const { data: userObj } = await getUserInfo() // 获取用户基本资料对象
        // console.log("没有token也调用了,");
        const { data: photoObj } = await getUserPhoto(userObj.userId) // 获取用户头像等
        const newObj = { ...userObj, ...photoObj } // 合并一个信息非常全的对象
        commit('SET_USER', newObj) // 保存到vuex的userInfo对象上 
    },
    // 退出登录
    async logOutActions({ commit }) {
        commit('REMOVE_USER')
        commit('REMOVE_TOKEN')
        commit('RESET_STATE')
        resetRouter()
    }
}
export default {
    // 开启命名空间
    namespaced: true,
    state,
    mutations,
    actions
}
